﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace Innvoice.Logica.GestorObject
{

    public class DatosEmpresa : INotifyPropertyChanged, IDataErrorInfo
    {

        string razonSocial;
        string responsableLegal;
        string direccion;
        string localidad;
        string provincia;
        string pais;
        string telefono;
        string direccionCorreo;
        string codigoPostal;
        string numeroDeDoc;
        string numeroDeContrib;
        string paginaWeb;
        public event PropertyChangedEventHandler PropertyChanged;

        
        public byte   CodigoEmpresa { get; set; }
        public string Error
        {
            get
            {
                return null;
            }
        }
        public string this[string propertyName]
        {
            get
            {
                return IsValid(propertyName);
            }
        }
        public string RazonSocial
        {
            get
            {
                return razonSocial;
            }
            set
            {
                razonSocial = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("RazonSocial"));
            }
        }
        public string ResponsableLegal 
        {            
            get
            {
                return responsableLegal;
            }
            set
            {
                responsableLegal = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ResponsableLegal"));
            } 
        }
        public string Direccion {
            get
            {
                return direccion;
            }
            set
            {
                direccion = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Direccion"));
            }
        }
        public string InicioActividad { get; set; }
        public string Localidad
        {
            get
            {
                return localidad;
            }
            set
            {
                localidad = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Localidad"));
            }
        }
        public string Provincia
        {
            get
            {
                return provincia;
            }
            set
            {
                provincia = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Provincia"));
            }
        }
        public string Pais
        {
            get
            {
                return pais;
            }
            set
            {
                pais = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Pais"));
            }
        }
        public string CodigoPostal
        {
            get
            {
                return codigoPostal;
            }
            set
            {
                codigoPostal = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("CodigoPostal"));
            }
        }
        public byte   TipoDoc { get; set; }
        public string NumeroDeDoc
        {
            get
            {
                return numeroDeDoc;
            }
            set
            {
                numeroDeDoc = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NumeroDeDoc"));
            }
        }
        public byte   TipoContribuyente { get; set; }
        public string NumeroDeContrib
        {
            get
            {
                return numeroDeContrib;
            }
            set
            {
                numeroDeContrib = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NumeroDeContrib"));
            }
        }
        public string Telefono
        {
            get
            {
                return telefono;
            }
            set
            {
                telefono = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Telefono"));
            }
        }
        public string DireccionCorreo
        {
            get
            {
                return direccionCorreo;
            }
            set
            {
                direccionCorreo = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("DireccionCorreo"));
            }
        }
        public string PaginaWeb
        {
            get
            {
                return paginaWeb;
            }
            set
            {
                paginaWeb = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("PaginaWeb"));
            }
        }
        public bool ExistenDatos { get; set; }


        public DatosEmpresa()
        {
            razonSocial = "";
            ResponsableLegal = "";
            direccion = "";
            localidad = "";
            provincia = "";
            pais = "";
            codigoPostal = "";
            numeroDeDoc = "";
            numeroDeContrib = "";
            direccionCorreo = "";
            paginaWeb = "";
            ExistenDatos = false;
        }


        private string IsValid(string propertyName)
        {
            switch (propertyName)
            {
                case "RazonSocial":
                    if (string.IsNullOrWhiteSpace(RazonSocial))
                        return "El campo Razon Social es requerido";
                    else if (10 > RazonSocial.Length)
                        return "El campo Razon Social debe " +
                            "contener más de 10 caracteres";
                    break;
                case "ResponsableLegal":
                    if (string.IsNullOrWhiteSpace(ResponsableLegal))
                        return "El campo Nombre es requerido";
                    else if (10 > ResponsableLegal.Length)
                        return "El campo Responsable Legal no debe " +
                            "contener más de 10 caracteres";
                    break;
                case "Direccion":
                    if (string.IsNullOrWhiteSpace(Direccion))
                        return "El campo Dirección es requerido";
                    else if (10 > Direccion.Length)
                        return "El campo Dirección debe " +
                            "contener más de 10 caracteres";
                    break;
                case "Localidad":
                    if (string.IsNullOrWhiteSpace(Localidad))
                        return "El campo Localidad es requerido";
                    break;
                case "Provincia":
                    if (string.IsNullOrWhiteSpace(Provincia))
                        return "El campo Provincia es requerido";
                    break;
                case "Pais":
                    if (string.IsNullOrWhiteSpace(Pais))
                        return "El campo País requerido";
                    break;
                case "CodigoPostal":
                    if (string.IsNullOrWhiteSpace(CodigoPostal))
                        return "El campo Codigo Postal es requerido - ej: 3000";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{4}$");
                        if (!regEx.IsMatch(CodigoPostal))
                            return "El campo Codigo Postal no " +
                                   "tiene un formato correcto \n ej:3000";
                    }
                    break;
                case "NumeroDeDoc":
                    if (string.IsNullOrWhiteSpace(NumeroDeDoc))
                        return "El campo Número de Documento es requerido \n ej: 23.489.345 o 23489345";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{1,3}\.[0-9]{3}\.[0-9]{3}|^[0-9]{8,9}$");
                        if (!regEx.IsMatch(NumeroDeDoc))
                            return "El campo Número de Documento no " +
                                   "tiene un formato correcto \n ej: 23.489.345 o 23489345";
                    }
                    break;

                case "NumeroDeContrib":
                    if (string.IsNullOrWhiteSpace(NumeroDeContrib))
                        return "El campo Número de Contribución es requerido \n ej: 27-23480444-0";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{2}\-[0-9]{7,9}\-[0-9]{1}$");
                        if (!regEx.IsMatch(NumeroDeContrib))
                            return "El campo Número de Contribución no \n" +
                                   "tiene un formato correcto \n ej:  27-23480444-0";
                    }
                    break;

                case "Telefono":
                    if (string.IsNullOrWhiteSpace(Telefono))
                        return "El campo Telefono es requerido";
                    break;
                case "DireccionCorreo":
                    if (string.IsNullOrWhiteSpace(DireccionCorreo))
                        return "El campo Correo Electrónico es requerido \n ej: notengo@gmail.com";
                    else if (15 > DireccionCorreo.Length)
                        return "El campo Correo Electrónico debe "
                            + "contener más de 15 caracteres";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\." +
                            @"(\w{2}|(com|net|org|edu|int|mil|gov|arpa|" +
                            @"biz|aero|name|coop|info|pro|museum))$");
                        if (!regEx.IsMatch(DireccionCorreo))
                            return "El campo Correo Electrónico no " +
                                   "tiene un formato correcto \n ej: notengo@gmail.com";
                    }
                    break;
                case "PaginaWeb":
                    if (string.IsNullOrWhiteSpace(PaginaWeb))
                        return "El campo Pagina Web es requerido \n ej: www.notengo.com";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^(www|http:\/\/)(.*\.(com$|net$|org$))");
                        if (!regEx.IsMatch(PaginaWeb))
                            return "El campo Pagina Web no " +
                                   "tiene un formato correcto \n ej: www.notengo.com";
                    }
                    break;
            }
            return null;
        }

        public bool IsValid()
        {
            return string.IsNullOrEmpty(IsValid("RazonSocial"))
                && string.IsNullOrEmpty(IsValid("ResponsableLegal"))
                && string.IsNullOrEmpty(IsValid("Direccion"))
                && string.IsNullOrEmpty(IsValid("Localidad"))
                && string.IsNullOrEmpty(IsValid("Provincia"))
                && string.IsNullOrEmpty(IsValid("Pais"))
                && string.IsNullOrEmpty(IsValid("CodigoPostal"))
                && string.IsNullOrEmpty(IsValid("NumeroDeDoc"))
                && string.IsNullOrEmpty(IsValid("NumeroDeContrib"))
                && string.IsNullOrEmpty(IsValid("Telefono"))
                && string.IsNullOrEmpty(IsValid("DireccionCorreo"))
                && string.IsNullOrEmpty(IsValid("PaginaWeb"));
        }

    }
}
